2024.6.27 固有値分解【numpy】
正方行列$ Aについて、
$ A\mathbf{v} = \lambda \mathbf{v}
が成立するとき、
$ \lambdaを$ Aの固有値
$ \mathbf{v}を$ Aの固有ベクトル
という。
Aが非対称行列の場合
上式は、行列$ Vを用いた相似変換によって、行列$ Aを対角化できることを意味している。
$ V^{-1}AV=D
code:eig1.py
import numpy as np
from numpy.linalg import eig, inv
data1 = 1, 2, 3], 2, 1, 3, [3, 1, 2 # Aは非対称行列
A = np.array(data1)
d, V = eig(A)
print('固有値\n',d)
print('固有ベクトルを並べた行列\n',V)
print('inv(V) * A * V =\n', inv(V)@A@V)
print('D =\n', np.diag(d))
結果
code:result1.txt
固有値
6. -1.00000001 -0.99999999
固有ベクトルを並べた行列
[ 0.57735027 0.51449576 -0.51449575
0.57735027 0.51449575 -0.51449576
0.57735027 -0.68599434 0.68599434]
inv(V) * A * V =
[ 6.00000002e+00 -2.84548207e-09 2.84548163e-09
-3.19401382e-08 -9.99999999e-01 -1.31192690e-08
-9.52118107e-10 5.36204786e-09 -9.99999991e-01]
D =
[ 6. 0. 0.
0. -1.00000001 0.
0. 0. -0.99999999]
Aが対称行列の場合
$ Aが対称行列の場合$ Vは直交行列となり、$ Vとその転置行列を用いて$ Aを対角化することができる。
$ V^\top A V = D
code:eig2.py
import numpy as np
from numpy.linalg import eig
data1 = 1, 2, 3], 2, 1, 3, [3, 3, 3 # Aは対称行列
A = np.array(data1)
d, V = eig(A)
print('固有値\n', d)
print('固有ベクトルを並べた行列\n',V)
print('V^T * A * V =\n', V.T @ A @V)
print('D=\n', np.diag(d))
print('V^T * V=\n', V.T @ V)
print('V * V^T=\n', V @ V.T)
結果
code:result2.txt
固有値
7.24264069 -1. -1.24264069
固有ベクトルを並べた行列
[-5.00000000e-01 -7.07106781e-01 -5.00000000e-01
-5.00000000e-01 7.07106781e-01 -5.00000000e-01
-7.07106781e-01 2.64437964e-15 7.07106781e-01]
V^T@A@V =
[ 7.24264069e+00 2.24050256e-16 -4.44089210e-16
5.56503013e-16 -1.00000000e+00 -2.66592676e-15
-6.66133815e-16 -2.49009605e-15 -1.24264069e+00]
D=
[ 7.24264069 0. 0.
0. -1. 0.
0. 0. -1.24264069]
V^T * V=
[ 1.00000000e+00 -2.04524239e-16 -2.22044605e-16
-2.04524239e-16 1.00000000e+00 1.64781417e-15
-2.22044605e-16 1.64781417e-15 1.00000000e+00]
V * V^T=
[ 1.00000000e+00 0.00000000e+00 -9.43689571e-16
0.00000000e+00 1.00000000e+00 9.43689571e-16
-9.43689571e-16 9.43689571e-16 1.00000000e+00]